package com.cg.leetcode;

import org.junit.Test;

import java.util.Arrays;

/**
 * 1996.游戏中弱角色的数量
 *
 * @program: LeetCode->LeetCode_1996
 * @author: cg
 * @create: 2022-04-14 14:49
 **/
public class LeetCode_1996 {

    @Test
    public void test1966() {
        System.out.println(numberOfWeakCharacters(new int[][]{{1, 5}, {10, 4}, {4, 3}}));
    }

    /**
     * 你正在参加一个多角色游戏，每个角色都有两个主要属性：攻击 和 防御 。给你一个二维整数数组 properties ，其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。
     * <p>
     * 如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级，则认为该角色为 弱角色 。更正式地，如果认为角色 i 弱于 存在的另一个角色 j ，那么 attackj > attacki 且 defensej > defensei 。
     * <p>
     * 返回 弱角色 的数量。
     * <p>
     * 示例 1：
     * 输入：properties = [[5,5],[6,3],[3,6]]
     * 输出：0
     * 解释：不存在攻击和防御都严格高于其他角色的角色。
     * <p>
     * 示例 2：
     * 输入：properties = [[2,2],[3,3]]
     * 输出：1
     * 解释：第一个角色是弱角色，因为第二个角色的攻击和防御严格大于该角色。
     * <p>
     * 示例 3：
     * 输入：properties = [[1,5],[10,4],[4,3]]
     * 输出：1
     * 解释：第三个角色是弱角色，因为第二个角色的攻击和防御严格大于该角色。
     * <p>
     * 提示：
     * 2 <= properties.length <= 10^5
     * properties[i].length == 2
     * 1 <= attacki, defensei <= 10^5
     *
     * @param properties
     * @return
     */
    public int numberOfWeakCharacters(int[][] properties) {
        // 进行排序，按攻击属性降序排序，如果攻击属性相同，则按防御属性升序排序
        Arrays.sort(properties, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);
        // defence保存前面的最大防御值，res保存若角色个数
        int maxDefence = Integer.MIN_VALUE, res = 0;
        for (int[] property : properties) {
            if (property[1] >= maxDefence) {
                maxDefence = property[1];
            } else {
                res++;
            }
        }
        return res;
    }

}
